package main

import (
	"fmt"
	"os"
)

func writeFiles(fileName string) {
	//file, err := os.Create(fileName)
	/**
	O_EXCL:如果同时指定了O_CREAT,并且文件已存在,则出错返回。
	O_CREATE:若此文件不存在则创建它。使用此选项时需要提供第三个参数mode ,表示该文件的访问权限。
	If there is an error, it will be of type *PathError.
	*/
	file, err := os.OpenFile(fileName, os.O_EXCL|os.O_CREATE, 0666)
	if err != nil {
		//panic(err)
		if pathError, ok := err.(*os.PathError); !ok {
			panic(err)
		} else {
			fmt.Printf("%s,%s,%s\n", pathError.Op, pathError.Path, pathError.Err)
		}
		return
	}
	defer file.Close()
}

func main() {

	file := "src/go-learning-process/6.错误处理和资源管理/kaka.txt"
	// open,src/go-learning-process/6.错误处理和资源管理/kaka.txt,The file exists.
	writeFiles(file)
}

/**
总结：在本节中，由于使用了O_EXCL这个参数，当并且文件已存在,则出错返回。

在这里使用了os.PathError这个值，那么这个值是从哪里得到的呢！

当你追踪这个方法的时候会有一行注释If there is an error, it will be of type *PathError.

PathError内部就是一个结构体，里边含有三个值
*/
